home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / quarkpy / qmacro.py < prev    next >
Text File  |  2004-01-05  |  9KB  |  348 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. Python macros available for direct call by QuArK
  4. """
  5. #
  6. # Copyright (C) 1996-2000 Armin Rigo
  7. # THIS FILE IS PROTECTED BY THE GNU GENERAL PUBLIC LICENCE
  8. # FOUND IN FILE "COPYING.TXT"
  9. #
  10. #$Header: /cvsroot/quark/runtime/quarkpy/qmacro.py,v 1.17 2003/12/17 13:58:59 peter-b Exp $
  11.  
  12. #
  13. # Macros are called by QuArK based on name. These are the
  14. # only direct calls that QuArK can make to Python. Usually,
  15. # Python provides callback to QuArK.
  16. #
  17.  
  18.  
  19. import quarkx
  20. import qtoolbar
  21. import qutils
  22.  
  23. #
  24. # Macros called when there is an object to display in a window.
  25. #
  26.  
  27. def MACRO_displaymap(self, what=None):
  28.     "Called when there is a map to display."
  29.     qutils.loadmapeditor(what)
  30.     import mapeditor
  31.     if isinstance(self.info, mapeditor.MapEditor):
  32.         self.info.ReopenRoot(self)
  33.     else:
  34.         mapeditor.MapEditor(self)   # new map editor
  35.  
  36. def MACRO_displaybsp(self):
  37.     MACRO_displaymap(self,'bsp')
  38.  
  39.  
  40. def MACRO_displaymdl(self):
  41.     "Called when there is a model to display."
  42.     qutils.loadmdleditor()
  43.     import mdleditor
  44.     if isinstance(self.info, mdleditor.ModelEditor):
  45.         self.info.ReopenRoot(self)
  46.     else:
  47.         mdleditor.ModelEditor(self)   # new model editor
  48.  
  49.  
  50.  
  51. #
  52. # Macro called when QuArK needs the images of a Duplicator.
  53. #
  54.  
  55. def MACRO_duplicator(dup):
  56.     "Computes Duplicator images."
  57.     qutils.loadmapeditor()
  58.     import mapduplicator
  59.     return mapduplicator.DupManager(dup).buildimages()
  60.  
  61.  
  62. #
  63. # Macro called when a linear operation is applied.
  64. #
  65.  
  66. def MACRO_applylinear(entity, matrix):
  67.     "Applies a linear distortion (rotate, zoom, etc) on an entity or a Duplicator."
  68.     # Note : "origin" is updated by QuArK before it calls this macro.
  69.     qutils.loadmapeditor()
  70.     import mapentities
  71.     mapentities.CallManager("applylinear", entity, matrix)
  72.  
  73.  
  74. #
  75. # Macro called when the mouse is over a control with a hint
  76. #
  77.  
  78. def MACRO_hint(form, text=None):
  79.     if form is None:
  80.         return ""
  81.     import qbaseeditor
  82.     if not isinstance(form.info, qbaseeditor.BaseEditor):
  83.         return
  84.     return form.info.showhint(text)
  85.  
  86.  
  87. #
  88. # Macro called to build a map (when the big GO! button is pressed).
  89. #
  90.  
  91. def MACRO_buildmaps(maps, mode, extracted, cfgfile="", defaultbsp=None):
  92.     "Builds maps and runs Quake."
  93.  
  94.     if mode is None:
  95.         code = "P"
  96.         text = "Play"
  97.     else:
  98.         code = quarkx.buildcodes[mode]
  99.         text = quarkx.buildmodes[mode]
  100.     forcepak = "K" in code
  101.     runquake = "P" in code
  102.     build = quarkx.newobj(":")
  103.  
  104.     if "C" in code:                #
  105.         build["Textures"] = "1"    # Complete rebuild
  106.         build["QCSG1"] = "1"       #
  107.         build["QBSP1"] = "1"
  108.         build["VIS1"] = "1"
  109.         build["LIGHT1"] = "1"
  110.         build["LIGHTCmd"] = "-extra"
  111.  
  112.     elif "F" in code:              #
  113.         build["Textures"] = "1"    # Fast rebuild
  114.         build["QCSG1"] = "1"       #
  115.         build["QBSP1"] = "1"
  116.  
  117.     else:                          #
  118.         pass                       # Don't build maps
  119.                                    #
  120.     maplist = []
  121.     for map in maps:
  122.         root = map['Root']
  123.         if root is None: continue
  124.         root = map.findname(root)
  125.         if root is None: continue
  126.         maplist.append((map, root, build))
  127.  
  128.     qutils.loadmapeditor()
  129.     import mapquakemenu
  130.     mapquakemenu.RebuildAndRun(maplist, None, runquake, text, forcepak, extracted, cfgfile, defaultbsp)
  131.  
  132.  
  133.  
  134. #
  135. # Macro called to "pack" a model.
  136. #
  137.  
  138. def MACRO_pack_model(model):
  139.     import mdlpack
  140.     return mdlpack.PackModel(model)
  141.  
  142. #
  143. # Macro called when a model component is modified.
  144. #
  145.  
  146. def MACRO_update_model(component):
  147.     import mdlpack
  148.     mdlpack.UpdateModel(component)
  149.  
  150.  
  151. #
  152. # Macro called when an item in the '?' menu is selected.
  153. #
  154.  
  155. helpfn = {}
  156. def MACRO_helpmenu(text):
  157.     import qeditor
  158.     getattr(qeditor, helpfn[text])()
  159.  
  160.  
  161. #
  162. # Macro called to open the OpenGL window in background
  163. #
  164.  
  165. def MACRO_OpenGL(minx, miny):
  166.     import qopengl, qeditor
  167.     qopengl.open(qeditor.mapeditor(), minx, miny, bkgnd=1)  #, force=1)
  168.  
  169. def MACRO_shutdown(text):
  170. #    quitfile=open(quarkx.exepath+'quit.txt','w')
  171. #    quitfile.write('quitting\n')
  172.     import qutils
  173.  
  174.     del qutils.ico_objects
  175.     del qutils.ico_editor
  176.     
  177.     for key in qutils.ico_dict.keys():
  178.         del qutils.ico_dict[key]
  179. #        quitfile.write('zapping '+key+'\n')
  180.     del qutils.ico_dict
  181.  
  182. #    quitfile.write('done\n')
  183. #    quitfile.close()
  184.     
  185. #
  186. #    ---- Dialog Boxes ----
  187. #
  188.  
  189. dialogboxes = {}
  190.  
  191. def closedialogbox(name):
  192.     try:
  193.         dialogboxes[name].close()
  194.         del dialogboxes[name]
  195.     except KeyError:
  196.         pass
  197.  
  198.  
  199. #
  200. # The class "dialogbox" is a base for actual dialog boxes.
  201. # See qeditor.py and mapfindreptex.py for examples.
  202. #
  203.  
  204. class dialogbox:
  205.  
  206.     dlgdef = ""
  207.     size = (300,170)
  208.     begincolor = None
  209.     endcolor = None
  210.     name = None
  211.     dfsep = 0.6
  212.     dlgflags = qutils.FWF_KEEPFOCUS | qutils.FWF_POPUPCLOSE
  213.  
  214.     def __init__(self, form, src, **buttons):
  215.         name = self.name or self.__class__.__name__
  216.         closedialogbox(name)
  217.         f = quarkx.newobj("Dlg:form")
  218.         f.loadtext(self.dlgdef)
  219.         self.f = f
  220.         for pybtn in f.findallsubitems("", ':py'):
  221.             pybtn["sendto"] = name
  222.         self.buttons = buttons
  223.         dlg = form.newfloating(self.dlgflags, f["Caption"])
  224.         dialogboxes[name] = dlg
  225.         dlg.windowrect = self.windowrect()
  226.         if self.begincolor is not None: dlg.begincolor = self.begincolor
  227.         if self.endcolor is not None: dlg.endcolor = self.endcolor
  228.         dlg.onclose = self.onclose
  229.         dlg.info = self
  230.         self.dlg = dlg
  231.         self.src = src
  232.         df = dlg.mainpanel.newdataform()
  233.         self.df = df
  234.         df.header = 0
  235.         df.sep = self.dfsep
  236.         df.setdata(src, f)
  237.         df.onchange = self.datachange
  238.         df.flags = 8   # DF_AUTOFOCUS
  239.         dlg.show()
  240.  
  241.     def windowrect(self):
  242.         x1,y1,x2,y2 = quarkx.screenrect()
  243.         cx = (x1+x2)/2
  244.         cy = (y1+y2)/2
  245.         size = self.size
  246.         return (cx-size[0]/2, cy-size[1]/2, cx+size[0]/2, cy+size[1]/2)
  247.  
  248.     def datachange(self, df):
  249.         pass   # abstract
  250.  
  251.     def onclose(self, dlg):
  252.         dlg.info = None
  253.         dlg.onclose = None   # clear refs
  254.         if self.df is not None:
  255.             self.df.onchange = None
  256.             self.df = None
  257.         self.dlg = None
  258.         del self.buttons
  259.  
  260.     def close(self, reserved=None):
  261.         self.dlg.close()
  262.  
  263.  
  264. def MACRO_pybutton(pybtn):
  265.     dlg = dialogboxes[pybtn["sendto"]]
  266.     return dlg.info.buttons[pybtn.shortname]
  267.  
  268. def MACRO_makeaddon(self):
  269.     import qutils
  270.     a = quarkx.getqctxlist()
  271.     a.reverse()
  272.     i = 0
  273.     while (a[i]["GameDir"] == None):
  274.         i = i + 1
  275.     a[i].makeentitiesfromqctx();
  276.  
  277. def MACRO_makeaddon_tex(self):
  278.     import qutils
  279.     a = quarkx.getqctxlist()
  280.     a.reverse()
  281.     i = 0
  282.     while (a[i]["GameDir"] == None):
  283.         i = i + 1
  284.     a[i].maketexturesfromqctx();
  285.  
  286. entfn = {}
  287.  
  288. def MACRO_loadentityplugins(self):
  289.     import plugins
  290.     plugins.LoadPlugins("ENT")
  291.     global MACRO_loadentityplugins
  292.     MACRO_loadentityplugins = lambda x: None    # next calls to loadmdleditor() do nothing
  293.  
  294. def MACRO_ent_convertfrom(text):
  295.     import qeditor
  296.     import qutils
  297.     a = quarkx.getqctxlist()
  298.     a.reverse()
  299.     # Decker - Some menuitem-captions contains a '&'-character (you know, the one which tells what mnemonic-key can be used)
  300.     # These '&'-characters has to be removed, for the entfn[text] to work properly.
  301.     text = text.replace("&", "")
  302.     entf = entfn[text]
  303.     if entf is not None:
  304.         files = quarkx.filedialogbox("Select File", text, entf[0], 0)
  305.         if len(files) != 0:
  306.             file = files[0]
  307.             gn = a[0]["GameDir"]
  308.             if (gn is None) or (gn == ""):
  309.                 gn = file
  310.             entf[1](a[0].parent, file, gn)
  311.  
  312.  
  313. # ----------- REVISION HISTORY ------------
  314. #
  315. #$Log: qmacro.py,v $
  316. #Revision 1.17  2003/12/17 13:58:59  peter-b
  317. #- Rewrote defines for setting Python version
  318. #- Removed back-compatibility with Python 1.5
  319. #- Removed reliance on external string library from Python scripts
  320. #
  321. #Revision 1.16  2003/07/24 18:22:36  peter-b
  322. #Marco's fix for the lambda bug
  323. #
  324. #Revision 1.15  2001/10/22 10:28:20  tiglari
  325. #live pointer hunt, revise icon loading
  326. #
  327. #Revision 1.14  2001/10/20 02:13:18  tiglari
  328. #live pointer hunt: redo shutdown macro
  329. #
  330. #Revision 1.13  2001/07/27 11:31:47  tiglari
  331. #bsp study: plane viewing, faces in treeview
  332. #
  333. #Revision 1.12  2001/06/18 20:30:12  decker_dk
  334. #Replace all '&'-characters with nothing, for menuitem-captions used as indexes into python-style dictionaries.
  335. #
  336. #Revision 1.11  2001/06/13 23:01:13  aiv
  337. #Moved 'Convert From' stuff to python code (plugin type)
  338. #
  339. #Revision 1.10  2001/03/28 19:23:15  decker_dk
  340. #Added '(*.fgd)' to the filedialogbox-call.
  341. #
  342. #Revision 1.9  2001/03/15 21:09:01  aiv
  343. #moved .fgd reading to menu, sepearted texture & entity reading
  344. #
  345. #Revision 1.5  2000/06/02 16:00:22  alexander
  346. #added cvs headers
  347. #
  348.